package com.liming.coupon.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.liming.common.pojo.dto.coupon.*;
import com.liming.common.pojo.dto.order.user.mini.MiniOrderSelectCouponDTO;
import com.liming.common.pojo.entity.coupon.Coupon;
import com.liming.common.pojo.vo.PageVO;
import com.liming.common.pojo.vo.coupon.openfeign.*;
import com.liming.common.pojo.vo.order.openfeign.mini.FeignMiniOrderSelectCouponVO;

import java.util.List;
import java.util.Map;

/**
 * @author liming
 * @date 2025/1/18
 */
public interface CouponMircoService extends IService<Coupon> {

    /**
     * 分页查询优惠券 - 后台
     *
     * @return 优惠券分页信息
     */
    PageVO<FeignCouponVO> pageCoupon(CouponPageQuery query);

    /**
     * 根据ID查询优惠券 - 后台
     *
     * @param id 优惠券ID
     * @return 优惠券信息
     */
    FeignCouponVO getCouponById(Long id);

    /**
     * 新增优惠券 - 后台
     *
     * @param addCouponDTO 新增优惠券参数
     * @return 是否新增成功
     */
    Boolean add(AddCouponDTO addCouponDTO);

    /**
     * 启用/禁用优惠券 - 后台
     *
     * @param id 优惠券ID
     * @return 是否启用/禁用成功
     */
    Boolean updAvailable(Long id);

    /**
     * 更新优惠券 - 后台
     *
     * @param updateCouponDTO 更新优惠券参数
     * @return 是否更新成功
     */
    Boolean updateCoupon(UpdateCouponDTO updateCouponDTO);

    /**
     * 删除优惠券 - 后台
     *
     * @param id 优惠券ID
     * @return 是否删除成功
     */
    Boolean removeCoupon(Long id);

    /**
     * 根据ID列表查询优惠券列表
     *
     * @param ids 优惠券ids
     * @return Map<优惠券Id, 优惠券>
     */
    Map<Long, Coupon> enableCouponMapByIds(List<Long> ids);

    /**
     * 用户领取优惠券 - 用户
     *
     * @param id 优惠券ID
     * @return 是否获取成功
     */
    Boolean get(Long id);

    /**
     * 校验优惠券是否可用 - 用户
     *
     * @param couponValidDTO 校验参数
     * @return 是否可用
     */
    Coupon checkAvailable(CouponValidDTO couponValidDTO);

    /**
     * 获取所有商品能够使用的最好的优惠券 满减券、折扣券
     *
     * @param productIdAndPriceMap 商品的Map<id、价格>
     * @return Map<商品id, 商品可使用的最好的优惠券列表>
     */
    Map<Long, List<FeignMiniCouponVO>> productCanUseCoupons(Map<Long, Integer> productIdAndPriceMap);

    /**
     * 商品详情页面 点击查看优惠券详情列表
     *
     * @param couponIds 优惠券IDS
     * @return 优惠券详情列表
     */
    List<FeignMiniProductUserCouponVO> couponDetailList(List<Long> couponIds);

    /**
     * 用户拥有的优惠券
     *
     * @return 用户拥有的优惠券
     */
    List<FeignMiniCouponVO> userHaveCoupons(Long userId);

    /**
     * 用户主页优惠券分页 - 小程序
     *
     * @param pageQuery 分页参数
     * @return 分页
     */
    PageVO<FeignMiniUserHomeCouponVO> userHomeCouponPage(UserHomeCouponPageQuery pageQuery);

    /**
     * 根据金额获取能使用的优惠券
     *
     * @param amount 金额
     * @return 可使用优惠券列表
     */
    List<FeignMiniCanUseCouponVO> canUseCouponsByAmount(Integer amount);

    /**
     * 根据金额获取不能使用的优惠券
     *
     * @param amount 金额
     * @return 不可使用优惠券列表
     */
    List<FeignMiniCannotUseCouponVO> cannotUseCouponsByAmount(Integer amount);

    /**
     * 用户选择优惠券 - 小程序
     *
     * @param dto 参数
     * @return 选择后订单商品结果
     */
    FeignMiniOrderSelectCouponVO miniOrderSelectCoupon(MiniOrderSelectCouponDTO dto);

    /**
     * 用户订单使用优惠券 - 小程序
     *
     * @param couponId 优惠券ID
     * @return 是否使用成功
     */
    Boolean userOrderUseCoupon(Long couponId);

    /**
     * 订单支付失败 优惠券退还
     *
     * @param userId   用户ID
     * @param couponId 优惠券ID
     * @return 是否退还成功
     */
    Boolean returnCoupon(Long userId, Long couponId);
}
